{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Chat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\n",
      "    \"台区编号\": \"16761186\",\n",
      "    \"台区名称\": \"电网_10千伏玉都城四线1016加哈尔巴格住宅楼\",\n",
      "    \"停电记录\": [\n",
      "        {\n",
      "            \"停电时间\": \"12月19日12时05分-12月19日12时06分\",\n",
      "            \"停电原因\": \"客户自行拉合表前开关\",\n",
      "            \"是否供电公司责任\": \"非供电公司责任\"\n",
      "        },\n",
      "        {\n",
      "            \"停电时间\": \"12月19日12时14分-12月19日12时15分\",\n",
      "            \"停电原因\": \"房屋内空气开关容量较小，热水器一经开启造成过负荷频繁跳闸\",\n",
      "            \"是否供电公司责任\": \"非供电公司责任\"\n",
      "        },\n",
      "        {\n",
      "            \"停电时间\": \"12月20日11时09分-12月20日11时10分\",\n",
      "            \"停电原因\": \"房屋内空气开关容量较小，热水器一经开启造成过负荷频繁跳闸\",\n",
      "            \"是否供电公司责任\": \"非供电公司责任\"\n",
      "        }\n",
      "    ]\n",
      "}\n"
     ]
    }
   ],
   "source": [
    "import ollama\n",
    "client = ollama.Client(host='http://192.168.20.43:11434')\n",
    "\n",
    "def llm_chat(sys, query):\n",
    "    system_prompt = sys\n",
    "    prompt = query\n",
    "    response = client.chat(\n",
    "        model='qwen2.5:14b', \n",
    "        # format='json',\n",
    "        options={\n",
    "            \"num_ctx\": 32768,  # 设置 num_ctx 参数\n",
    "            \"temperature\": 0,  # 设置 temperature 参数\n",
    "            # \"top_p\": 0.9  # 设置 top_p 参数\n",
    "            # 可以添加的其他参数:\n",
    "            # \"max_tokens\": 150,  # 设置最大生成的token数量\n",
    "            # \"stop\": [\"\\n\", \"结束\"],  # 设置停止生成的token\n",
    "            # \"stream\": False,  # 是否启用流式响应\n",
    "            # \"presence_penalty\": 0.0,  # 设置存在惩罚\n",
    "            # \"frequency_penalty\": 0.0,  # 设置频率惩罚\n",
    "            # \"logprobs\": None,  # 设置返回log概率\n",
    "            # \"echo\": False,  # 是否回显输入\n",
    "            # \"n\": 1,  # 设置生成的回复数量\n",
    "        },\n",
    "        messages=[{'role': 'system', 'content': system_prompt},\n",
    "                  {'role': 'user', 'content': prompt}],\n",
    "    )\n",
    "    return response['message']['content']\n",
    "\n",
    "#测试\n",
    "sys = \"\"\"\n",
    "## 任务\n",
    "你的任务是从以下文本中提取停电相关信息，并按照指定的JSON格式输出。请确保提取的信息完整且格式规范。提取要求如下：\n",
    "\n",
    "1. 提取停电记录，包括停电时间、停电原因和是否供电公司责任\n",
    "2. 停电时间格式统一为\"月日时分\"格式，且需完整记录停电开始和结束时间\n",
    "3. \"是否供电公司责任\"字段统一使用\"供电公司责任\"或\"非供电公司责任\"描述\n",
    "4. 确保提取完整的台区编号\n",
    "5. 确保提取完整的台区名称，台区名称是电力系统中用于唯一标识配电台区的标准化名称，通常包含 电压等级、变电站 / 线路信息、设备属性（公变 / 专变）、具体位置 / 用户 / 设备名称 等关键要素，用于区分不同供电单元。通常与台区编号在一起。\n",
    "6. 台区名称必须显示全称，不得进行任何简化或省略。例如将\"丰达农场公变\"完整显示为\"35千伏乌拉斯台农场变10千伏乌东线（1013）丰达农场公变\"。\n",
    "7. 不得遗漏任何停电记录\n",
    "\n",
    "## 仅输出JSON格式，Like：\n",
    "{\n",
    "    \"台区编号\": \"XXXX\",\n",
    "    \"台区名称\": \"XXXX\",\n",
    "    \"停电记录\": [\n",
    "        {\n",
    "            \"停电时间\": \"MM月DD日HH时mm分-MM月DD日HH时mm分\",\n",
    "            \"停电原因\": \"XXXX\",\n",
    "            \"是否供电公司责任\": \"供电公司责任/非供电公司责任\"\n",
    "        },\n",
    "        ...\n",
    "    ]\n",
    "}\n",
    "\n",
    "\"\"\"\n",
    "query = \"\"\"\n",
    "已处理完毕。12月20日，经【巴音郭楞蒙古自治州且末县】城区供电所工作人员艾力西尔、用电检查人员买尔丹到达现场联系客户后核实，客户反映情况确实存在，但非供电企业责任。现场实际情况是：客户（用户编号：2380991695，用户名称：麦菲娜·亚力坤，用电类别：城镇居民生活用电；台区编号：16761186；台区名称：电网_10千伏玉都城四线1016加哈尔巴格住宅楼）所在小区两个月内因供电企业原因停电0次，非供电企业责任3次，具体停电情况：第一次停电时间为12月19日12时05分-12时06分，客户自行拉合表前开关；第二次停电时间为12月19日12时14分-12时15分；第三次停电时间为12月20日11时09分-11时10分，均因客户家中增加负荷（热水器），房屋内空气开关（客户侧产权）开关容量较小，热水器一经开启造成过负荷频繁跳闸。整改措施：对小区定期开展用电检查工作，对发现设备隐患的问题及时整改，避免此类问题再次发生，已采取工作人员向客户解释清楚并建议客户及时更换大容量空气开关的措施。已于12月25日将处理结果告知客户（19209965304），客户表示满意。（台区经理：帕拉提·加马力 、所在小区：加哈尔巴格小区、附件：现场回访单）\n",
    "\"\"\"\n",
    "response = llm_chat(sys, query)\n",
    "print(response)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 测试烟雨\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "收到收到！8点左右的话，我们正好可以为您准备妥当。😊您是需要预定大厅的位置还是包间呢？\n",
      "\n",
      "另外，为了更好地服务您，能告诉我是否有哪位朋友有特殊饮食需求吗？比如忌口、过敏之类的。如果有小朋友或者老人同行的话，我们也提供特别的关怀哦！😉\n"
     ]
    }
   ],
   "source": [
    "sys=\"\"\"\n",
    "我需要你分析以下用户反馈数据，帮我：\n",
    "1. 将反馈按主题和情感倾向进行聚类分析\n",
    "2. 识别出最常被提及的产品问题和痛点，按严重程度排序\n",
    "3. 挖掘用户隐藏需求和期望\n",
    "4. 找出那些看似不起眼但多个用户都提到的细节问题\n",
    "5. 对比不同时间段的反馈变化，看产品迭代效果\n",
    "\n",
    "请用表格形式展示主要发现，并用数据支持你的结论。最后给出3-5条最需要优先解决的问题建议。\n",
    "\n",
    "用户反馈数据如下：\n",
    "\"\"\"\n",
    "query=\"\"\"\n",
    "国网新疆焉耆县供电公司客户反映导线断线导致低压故障。\n",
    "国网新疆和硕县供电公司客户反映低压线路负荷过高故障引起。\n",
    "国网新疆轮台县供电公司客户反映客户所在公用低压线径细,负荷过重。\n",
    "国网新疆和静县供电公司客户反映客户所在公用低压线径细,最近煤改电新装用户较多,负荷过重。\n",
    "国网新疆轮台县供电公司客户反映该台区煤改电用户较多负荷过重引起。\n",
    "国网新疆轮台县供电公司客户反映负载过重引起的低压。\n",
    "国网新疆焉耆县供电公司客户反映七南线37号公变负荷过重引起低电压。\n",
    "国网新疆若羌县供电公司客户反映线夹烧断导致低压线路低电压故障。\n",
    "国网新疆和静县供电公司客户反映煤改电用户较多负荷过重引起低压。\n",
    "国网新疆和硕县供电公司客户反映客户所在公用低压线径细,最近煤改电新装用户较多,负荷过重。\n",
    "库尔勒市供电中心客户反映客户所在公用低压因冬季使用电采暖用户较多,负荷过重,导致线路低电压故障。\n",
    "国网新疆和静县供电公司客户反映变压器高压熔丝自然断落故障。\n",
    "国网新疆轮台县供电公司客户反映台区负荷增大导致该公变重载引起。\n",
    "国网新疆轮台县供电公司客户反映跌落式熔断器烧坏导致低压线路低电压故障。\n",
    "国网新疆和静县供电公司客户反映客户所在台区变压器档位偏低故障。\n",
    "国网新疆轮台县供电公司客户反映过负荷跌落式熔断器烧坏。\n",
    "国网新疆和静县供电公司客户反映客户所在台区新增电采暖用户较多且线路卡脖子。\n",
    "国网新疆和硕县供电公司客户反映公变跌落保险熔丝熔断故障引起低压。\n",
    "国网新疆焉耆县供电公司客户反映低电压导致客户电器无法正常工作。\n",
    "国网新疆和静县供电公司客户反映用户出线故障。\n",
    "国网新疆和静县供电公司客户反映用户出线故障引起小区低压零线带电。\n",
    "国网新疆轮台县供电公司客户反映客户所在公用低压线径细,最近煤改电新装用户较多,负荷过重。\n",
    "国网新疆轮台县供电公司客户反映用户接入大功率电动机设备。\n",
    "国网新疆焉耆县供电公司客户反映前期客户家中电压低造成。\n",
    "国网新疆和静县供电公司客户反映用户接入大功率电动机设备。\n",
    "国网新疆轮台县供电公司客户反映用电设备过多导致电压波动低压。\n",
    "国网新疆和静县供电公司客户反映客户资产内部低压线路设备故障。\n",
    "国网新疆焉耆县供电公司客户反映用户侧距离负荷中心较远，高峰时段出现低电压。\n",
    "国网新疆且末县供电公司客户反映公变进线低压电缆烧坏导致用户电压异常故障引起。\n",
    "国网新疆和静县供电公司客户反映用户处于线路末端，且为两线供电，在用电高峰期出现低压情况。\n",
    "国网新疆和静县供电公司客户反映用户处于线路末端，且为两线供电。\n",
    "国网新疆轮台县供电公司客户反映公变零线断线低压电压波动故障。\n",
    "国网新疆轮台县供电公司客户反映线路供电半径较长引起线路末段低压。\n",
    "国网新疆和静县供电公司客户反映线路末端用电负荷增大导致低压现象。\n",
    "库尔勒市供电中心客户反映在水井用户共同用电时造成此现象。\n",
    "国网新疆轮台县供电公司客户反映客户所在公用低压线径细、距离电源变电站约18.2公里,超出正常供电范围。\n",
    "国网新疆轮台县供电公司客户反映线路负荷较大,线路供电半径较长引起线路末段低电压。\n",
    "库尔勒市供电中心客户反映客户内部资产表后低压入户线路火线漏电故障。\n",
    "国网新疆轮台县供电公司客户反映用户所在线路供电半径长农灌用户较多,负荷过重。\n",
    "国网新疆轮台县供电公司客户反映线路电压低。\n",
    "国网新疆轮台县供电公司客户反映线路供电半径长，负荷过重。\n",
    "库尔勒市供电中心客户反映用户突然增加用电设备功率较大导致电压低。\n",
    "国网新疆轮台县供电公司客户反映线路负荷过重。\n",
    "国网新疆和硕县供电公司客户反映因站内设备故障导致负荷重，电压压降大。\n",
    "库尔勒市供电中心客户反映用户所在线路负荷过重。\n",
    "国网新疆焉耆县供电公司客户反映电杆距离用户低压线路过长。\n",
    "国网新疆和静县供电公司客户反映因该台区负荷突增。\n",
    "国网新疆焉耆县供电公司客户反映该低压用户所在台区末端，且大部分用户集中在B相。\n",
    "国网新疆轮台县供电公司客户反映低压进线侧隔离开关上桩头A相螺丝松动导致缺相故障。\n",
    "国网新疆若羌县供电公司客户反映低压线路负荷过大导致电压不稳。\n",
    "国网新疆轮台县供电公司客户反映客户所在公用低压线径细,负荷过重。\n",
    "国网新疆焉耆县供电公司客户反映工业用电用户多引起线路低电压。\n",
    "\"\"\"\n",
    "\n",
    "response = llm_chat(sys, query)\n",
    "print(response)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 流式响应\n",
    "\n",
    "可以通过设置 stream=True 启用响应流，使函数调用返回一个 Python 生成器，其中每个部分都是流中的一个对象。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "选择午餐取决于你的口味偏好、饮食习惯和手头的食材。这里有几个建议，希望能给你一些灵感：\n",
      "\n",
      "1. **中式快餐**：比如炒面、盖浇饭或者素菜汤配米饭。\n",
      "2. **西式简餐**：三明治或沙拉都是不错的选择，简单快捷且营养均衡。\n",
      "3. **轻食健康餐**：可以考虑自制一份色拉搭配一些鸡胸肉或是豆腐等高蛋白低脂的食物。\n",
      "4. **家庭便当**：提前准备一些适合冷吃的菜肴，比如炖菜、炒蔬菜和鸡蛋卷。\n",
      "\n",
      "如果家里有现成的食材，可以根据手头的东西来做决定。例如：\n",
      "- 如果冰箱里有剩米饭，可以考虑做韩式拌饭或日式的茶泡饭。\n",
      "- 有一些新鲜蔬菜的话，不妨尝试一下简单的凉拌黄瓜或是西红柿蛋花汤。\n",
      "- 手边如果有面包或者馒头，配上一些火腿、鸡蛋和生菜叶也能做出一份美味的三明治。\n",
      "\n",
      "最后别忘了根据自己的喜好来选择哦！"
     ]
    }
   ],
   "source": [
    "import ollama\n",
    "client = ollama.Client(host='http://192.168.20.43:11434')\n",
    "\n",
    "stream = client.chat(\n",
    "    model='qwen2.5:14b', \n",
    "    stream=True,\n",
    "    messages=[\n",
    "        {\n",
    "            'role': 'user',\n",
    "            'content': '今天中午吃什么好？',\n",
    "        },]\n",
    "    )\n",
    "    \n",
    "for chunk in stream:\n",
    "  print(chunk['message']['content'], end='', flush=True)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
